7335
21008
У мене є список разів у секундах, наприклад:
L = [0,10218048, 1,20851996, 1,46800021, 1,73429061, 2,71525848,
3,14781922, 3,63637958, 5,11147358, 5,97497864, 6,35469013,
6,80623747, 6,99571917, 7,65215123, 7,86108352, 8,52988247,
8.83068894, 10.07690977, 11.53867284, 12.01214112, 12.13307653]
Для кожного вікна довжиною 2 секунди, починаючи з другої межі, я хотів би вивести список усіх часів, що потрапляють у 2-секундне вікно. Отже, для наведеного вище прикладу це буде:
[0,10218048, 1,20851996, 1,46800021, 1,73429061]
[1.20851996, 1.46800021, 1.73429061, 2.71525848]
[2,71525848, 3,14781922, 3,63637958]
[3,14781922, 3,63637958]
[5.11147358, 5.97497864]
[5.11147358, 5.97497864, 6.35469013, 6.80623747, 6.99571917]
[6,35469013, 6,80623747, 6,99571917, 7,65215123, 7,86108352]
[7,65215123, 7,86108352, 8,52988247, 8,83068894]
[8,52988247, 8,83068894]
[10.07690977]
[10.07690977, 11.5386728]
[11.5386728, 12.01214112, 12.13307653]
[12.01214112, 12.13307653]
Загалом довжина вікна може відрізнятися від 2.
Як ви можете це зробити? 
Я думаю, ви мали на увазі збільшення на основі "Для кожного вікна довжиною 2 секунди, починаючи з другої межі", а не перекриття. Протягом двох секундних інтервалів це те саме, але оскільки ви хочете змінювати довжину, перекриття в одну секунду буде 0-3, 2-5, 4-7, але збільшення означатиме 0-3, 1-4, 2- 5. Однак цікаво було знайти рішення для обох на всякий випадок.
Якщо припустити, що L відсортовано, а всі елементи позитивні, а другі інтервали починаються з цілих чисел, ми можемо використовувати цей метод:
імпортна математика
з колекцій імпортувати defaultdict
L = [0,10218048, 1,20851996, 1,46800021, 1,73429061, 2,71525848,
3,14781922, 3,63637958, 5,11147358, 5,97497864, 6,35469013,
6,80623747, 6,99571917, 7,65215123, 7,86108352, 8,52988247,
8.83068894, 10.07690977, 11.53867284, 12.01214112, 12.13307653]
my_ranges = defaultdict (список)
інтервал_ширини = 2
для x в L:
upper_bound = math.ceil (x)
lower_bound = верхній_bound - інтервал_ширини
нижній_обмежений = макс. (0, нижній_обмежений)
для y в діапазоні (нижня межа, верхня межа):
my_ranges [y] .append (x)
для відсортованого (my_ranges):
print (my_ranges [a])
Не знаю, чи хочете ви побачити, чи немає порожніх діапазонів. Але за замовчуванням ви порожні діапазони друкує, якщо ви теж хочете. Використовуйте цей рядок замість "для відсортованого":
для діапазону в діапазоні (хв (мої_діапазони), макс. (мої_діапазони) + 1)
Якщо ви хотіли діапазони 0-3, 2-5, 4-7, це працює:
імпортна математика
з колекцій імпортувати defaultdict
L = [0,10218048, 1,20851996, 1,46800021, 1,73429061, 2,71525848,
3,14781922, 3,63637958, 5,11147358, 5,97497864, 6,35469013,
6,80623747, 6,99571917, 7,65215123, 7,86108352, 8,52988247,
8.83068894, 10.07690977, 11.53867284, 12.01214112, 12.13307653]
інтервал_ширини = 2
my_ranges_2 = defaultdict (список)
для x в L:
однозначно_в = (х // (ширина_інтервалу - 1)) * (ширина_інтервалу - 1) # найнижче кратне ширини_інтервалу нижче х завжди буде в
#print ("Додавання", x, "до", однозначно_в)
my_ranges_2 [безумовно_в] .append (x)
якщо x <однозначно_в + 1 та визначено_в - інтервал_ширини> = 0: # наприклад, якщо х дорівнює 2,3, а ми маємо 0,3 2,5 тощо ... нам потрібно впізнати цей повторюваний випадок. Я припускаю, що довжини вікон є цілими числами, а якщо ні, то нам потрібно зробити набагато більше, тому що число може йти в декількох масивах. Можливо, ми могли б мати цикл while, збільшуючи на (інтервал_ширини - 1)
#print ("++ Додавання", x, "до", однозначно_в - інтервал_ширини + 1)
my_ranges_2 [безумовно_в - ширина_інтервалу + 1] .append (x)
для відсортованого (my_ranges_2):
друк (a, my_ranges_2 [a])
# print (my_ranges_2 [a])
Я підозрюю, що я забув деякі деталі, але, сподіваюся, ви можете перекрутити interval_width, якщо потрібно, щоб переконатися, що мій код робить те, що ви сподівались, і дайте мені знати, що саме вам потрібно.
|
Можливе рішення, яке я можу запропонувати, є "ефективним" у певному сенсі: воно повторюється лише один раз через вхідні дані і не має залежностей. Вартість, звичайно, полягає в тому, що він написаний чистим пітоном (може бути оптимізований код) і що він вводить більше змінних відстеження, щоб запобігти повторення (і, отже, менш пітонічний).
def sliding_window (дані, тривалість, старт = 0, перекриття = 1):
результат = []
data_idx = 0
result_idx = 0
верхній = початок + тривалість
нижній = старт
next_lower = верхній - перекриття
# внутрішній помічник для заповнення порожніх внутрішніх списків до нашої точки вставки та вставки
def pad_and_append (at):
while len (результат) <= на:
result.append ([])
результат [at] .append (data [data_idx])
# ітерація через вхідні дані
в той час як data_idx  a:
якщо x  = l [0]) & (L  = i) & (L